////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                                            //
//                                                         WNProject                                                          //
//                                                                                                                            //
//            This file is distributed under the BSD 2-Clause open source license. See License.txt for details.               //
//                                                                                                                            //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef __WN_FUNCTION_H__
#define __WN_FUNCTION_H__

#include <vector>
#include "WNScripting/inc/WNIdentifierElement.h"

struct WNNativeElementType;
namespace WNCallingConvention {
    enum Convention {
        WN_CDECL
    };
}

namespace llvm {
    class Function;
    class FunctionType;
};

struct WNFunction {
    WN_VOID* mFunctionPointer;
    WNCallingConvention::Convention mCallingConv;
    WN_BOOL mExternal;
    std::vector<WNNativeElementType*> mTypes;
    WNNativeElementType* mReturnType;
    WNIdentifierElement mFunctionName;
    llvm::Function* mLlvmFunction;
    llvm::FunctionType* mLlvmFunctiontype;
    WNIdentifierElement mFile;
    WN_BOOL mStackRet;
    WN_SIZE_T mOffset;
    WN_SIZE_T mEndOffset;
};

#endif //__WN_FUNCTION_H__

